using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace AppManagement.MainManagers
{
	#region using
	using DevComponents.DotNetBar;
	using AppManagement.Models;
	using AppManagement.Repositories;
	using AppManagement.Helpers;
	using System.Data;
	using System.Drawing;
	using System.IO;
	#endregion

	public partial class FrmLichHoatDong : Office2007Form
	{
		public EventHandler Handler { get; set; }

        public FrmLichHoatDong()
		{
			InitializeComponent();
		}

		private void FrmQuanLyTuyenXe_Load(object sender, EventArgs e)
		{
			InitGridView();
            InitGridViewChuyenXe();
			dtgvData.ClearSelection();
		}

		private void InitGridView()
		{
			DataGridViewTextBoxColumn objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Mã tuyến xe",
				DataPropertyName = "MaTuyenXe",
				Name = "MaTuyenXe",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Điểm bắt đầu",
				DataPropertyName = "MaDiemBatDau",
				Name = "MaDiemBatDau",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
                HeaderText = "Điểm kết thúc",
				DataPropertyName = "MaDiemKetThuc",
				Name = "MaDiemKetThuc",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Độ dài (Km)",
				DataPropertyName = "DoDai",
				Name = "DoDai",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Ngày hoạt động",
				DataPropertyName = "NgayHoatDong",
				Name = "NgayHoatDong",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5)) - 1
			};
			dtgvData.Columns.Add(objColumn);
		}

        /// <summary>
        /// Load danh sach tuyen xe
        /// </summary>
		private void LoadTuyenXes()
		{
			var lstItem = TuyenXeRepository.SelectAll();

			var dt = new DataTable();
			dt.Columns.Add("MaTuyenXe");
			dt.Columns.Add("MaDiemBatDau");
			dt.Columns.Add("MaDiemKetThuc");
			dt.Columns.Add("DoDai");
			dt.Columns.Add("NgayHoatDong");
			for (int i = 0; i < lstItem.Count; i++)
			{
				dt.Rows.Add(lstItem[i].MaTuyenXe, lstItem[i].DiaDiem.TenDiaDiem, lstItem[i].DiaDiem1.TenDiaDiem, lstItem[i].DiaDiem1.DoDai, "Thứ: " + lstItem[i].NgayHoatDong);
			}
			DataView objTimeSheetDV = new System.Data.DataView(dt);
			objTimeSheetDV.AllowNew = false;
			dtgvData.AutoGenerateColumns = false;
			dtgvData.DataSource = objTimeSheetDV;
			dtgvData.ClearSelection();
		}

        private void dtgvData_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dtgvData.SelectedRows == null || dtgvData.SelectedRows.Count == 0)
                return;

            txtMaTuyenXe.Text = dtgvData.SelectedRows[0].Cells["MaTuyenXe"].Value.ToString();
            var tuyenXe = TuyenXeRepository.SelectByID(int.Parse(dtgvData.SelectedRows[0].Cells["MaTuyenXe"].Value.ToString()));

            LoadChuyenXe(tuyenXe);
            DisableNgayKhongHoatDong(tuyenXe.NgayHoatDong);
            DisplayNgayHoatDong();
        }

        /// <summary>
        /// Hien thi ngay hoat dong
        /// </summary>
        private void DisplayNgayHoatDong()
        {
            // Loop for all chuyen xe
            foreach (DataGridViewRow row in dtgvChuyenXe.Rows)
            {
                var maChuyenXe = int.Parse(row.Cells["MaChuyenXe"].Value.ToString());
                var lichHoatDong = LichHoatDongRepository.SelectByMaChuyenXeNgayBDNgayKT(maChuyenXe, dtTuNgay.Value, dtDenNgay.Value);
                // Da lap lich hoat dong cho chuyen xe nay
                if (lichHoatDong != null)
                {
                    // Lap qua danh sach chi tiet lich hoat dong
                    if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Equals(dtTuNgay.Value)) != null)// Thu 2
                        row.Cells["Thu2"].Value = true;
                    if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Equals(dtTuNgay.Value.AddDays(1))) != null)// Thu 3
                        row.Cells["Thu3"].Value = true;
                    if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Equals(dtTuNgay.Value.AddDays(2))) != null)// Thu 4
                        row.Cells["Thu4"].Value = true;
                    if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Equals(dtTuNgay.Value.AddDays(3))) != null)// Thu 5
                        row.Cells["Thu5"].Value = true;
                    if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Equals(dtTuNgay.Value.AddDays(4))) != null)// Thu 6
                        row.Cells["Thu6"].Value = true;
                    if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Equals(dtTuNgay.Value.AddDays(5))) != null)// Thu 7
                        row.Cells["Thu7"].Value = true;
                    if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Equals(dtTuNgay.Value.AddDays(6))) != null)// Chu nhat
                        row.Cells["CN"].Value = true;
                }
            }
        }

        /// <summary>
        /// Tuyen xe chi hoat dong o 1 so ngay nhat dinh, cac ngay con lai se bi disable di
        /// </summary>
        /// <param name="ngayHoatDong"></param>
        private void DisableNgayKhongHoatDong(string ngayHoatDong)
        {
            // Loop for all chuyen xe
            foreach (DataGridViewRow row in dtgvChuyenXe.Rows)
            {
                row.Cells["MaChuyenXe"].ReadOnly = true;
                row.Cells["HoTen"].ReadOnly = true;
                row.Cells["MaBSXe"].ReadOnly = true;
                row.Cells["GioKhoiHanh"].ReadOnly = true;
                row.Cells["DonGia"].ReadOnly = true;

                // First disable all cell ngay hoat dong
                row.Cells["Thu2"].ReadOnly = true;
                row.Cells["Thu2"].Style.BackColor = Color.Red;
                row.Cells["Thu3"].ReadOnly = true;
                row.Cells["Thu3"].Style.BackColor = Color.Red;
                row.Cells["Thu4"].ReadOnly = true;
                row.Cells["Thu4"].Style.BackColor = Color.Red;
                row.Cells["Thu5"].ReadOnly = true;
                row.Cells["Thu5"].Style.BackColor = Color.Red;
                row.Cells["Thu6"].ReadOnly = true;
                row.Cells["Thu6"].Style.BackColor = Color.Red;
                row.Cells["Thu7"].ReadOnly = true;
                row.Cells["Thu7"].Style.BackColor = Color.Red;
                row.Cells["CN"].ReadOnly = true;
                row.Cells["CN"].Style.BackColor = Color.Red;

                if (ngayHoatDong.Contains("2"))
                {
                    row.Cells["Thu2"].ReadOnly = false;
                    row.Cells["Thu2"].Style.BackColor = Color.Green;
                }
                if (ngayHoatDong.Contains("3"))
                {
                    row.Cells["Thu3"].ReadOnly = false;
                    row.Cells["Thu3"].Style.BackColor = Color.Green;
                }
                if (ngayHoatDong.Contains("4"))
                {
                    row.Cells["Thu4"].ReadOnly = false;
                    row.Cells["Thu4"].Style.BackColor = Color.Green;
                }
                if (ngayHoatDong.Contains("5"))
                {
                    row.Cells["Thu5"].ReadOnly = false;
                    row.Cells["Thu5"].Style.BackColor = Color.Green;
                }
                if (ngayHoatDong.Contains("6"))
                {
                    row.Cells["Thu6"].ReadOnly = false;
                    row.Cells["Thu6"].Style.BackColor = Color.Green;
                }
                if (ngayHoatDong.Contains("7"))
                {
                    row.Cells["Thu7"].ReadOnly = false;
                    row.Cells["Thu7"].Style.BackColor = Color.Green;
                }
                if (ngayHoatDong.Contains("cn"))
                {
                    row.Cells["CN"].ReadOnly = false;
                    row.Cells["CN"].Style.BackColor = Color.Green;
                }
            }
        }

        private void InitGridViewChuyenXe()
        {
            DataGridViewTextBoxColumn objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Mã chuyến xe",
                DataPropertyName = "MaChuyenXe",
                Name = "MaChuyenXe",
                Width = (int)((dtgvChuyenXe.Width - dtgvChuyenXe.RowHeadersWidth) * ((double)1 / 12))
            };
            dtgvChuyenXe.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Tài xế",
                DataPropertyName = "HoTen",
                Name = "HoTen",
                Width = (int)((dtgvChuyenXe.Width - dtgvChuyenXe.RowHeadersWidth) * ((double)1 / 12))
            };
            dtgvChuyenXe.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Mã BS Xe",
                DataPropertyName = "MaBSXe",
                Name = "MaBSXe",
                Width = (int)((dtgvChuyenXe.Width - dtgvChuyenXe.RowHeadersWidth) * ((double)1 / 12))
            };
            dtgvChuyenXe.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Giờ khởi hành",
                DataPropertyName = "GioKhoiHanh",
                Name = "GioKhoiHanh",
                Width = (int)((dtgvChuyenXe.Width - dtgvChuyenXe.RowHeadersWidth) * ((double)1 / 12))
            };
            dtgvChuyenXe.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Đơn giá",
                DataPropertyName = "DonGia",
                Name = "DonGia",
                Width = (int)((dtgvChuyenXe.Width - dtgvChuyenXe.RowHeadersWidth) * ((double)1 / 12)) 
            };
            dtgvChuyenXe.Columns.Add(objColumn);

            DataGridViewCheckBoxColumn objColumn2 = new DataGridViewCheckBoxColumn
            {
                HeaderText = "Thứ 2",
                DataPropertyName = "Thu2",
                Name = "Thu2",
                Width = (int)((dtgvChuyenXe.Width - dtgvChuyenXe.RowHeadersWidth) * ((double)1 / 12))
            };
            dtgvChuyenXe.Columns.Add(objColumn2);

            objColumn2 = new DataGridViewCheckBoxColumn
            {
                HeaderText = "Thứ 3",
                DataPropertyName = "Thu3",
                Name = "Thu3",
                Width = (int)((dtgvChuyenXe.Width - dtgvChuyenXe.RowHeadersWidth) * ((double)1 / 12)) 
            };
            dtgvChuyenXe.Columns.Add(objColumn2);

            objColumn2 = new DataGridViewCheckBoxColumn
            {
                HeaderText = "Thứ 4",
                DataPropertyName = "Thu4",
                Name = "Thu4",
                Width = (int)((dtgvChuyenXe.Width - dtgvChuyenXe.RowHeadersWidth) * ((double)1 / 12)) 
            };
            dtgvChuyenXe.Columns.Add(objColumn2);

            objColumn2 = new DataGridViewCheckBoxColumn
            {
                HeaderText = "Thứ 5",
                DataPropertyName = "Thu5",
                Name = "Thu5",
                Width = (int)((dtgvChuyenXe.Width - dtgvChuyenXe.RowHeadersWidth) * ((double)1 / 12))
            };
            dtgvChuyenXe.Columns.Add(objColumn2);

            objColumn2 = new DataGridViewCheckBoxColumn
            {
                HeaderText = "Thứ 6",
                DataPropertyName = "Thu6",
                Name = "Thu6",
                Width = (int)((dtgvChuyenXe.Width - dtgvChuyenXe.RowHeadersWidth) * ((double)1 / 12)) 
            };
            dtgvChuyenXe.Columns.Add(objColumn2);

            objColumn2 = new DataGridViewCheckBoxColumn
            {
                HeaderText = "Thứ 7",
                DataPropertyName = "Thu7",
                Name = "Thu7",
                Width = (int)((dtgvChuyenXe.Width - dtgvChuyenXe.RowHeadersWidth) * ((double)1 / 12)) 
            };
            dtgvChuyenXe.Columns.Add(objColumn2);

            objColumn2 = new DataGridViewCheckBoxColumn
            {
                HeaderText = "Chủ nhật",
                DataPropertyName = "CN",
                Name = "CN",
                Width = (int)((dtgvChuyenXe.Width - dtgvChuyenXe.RowHeadersWidth) * ((double)1 / 12)) - 2
            };
            dtgvChuyenXe.Columns.Add(objColumn2);

            dtgvChuyenXe.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        }

        /// <summary>
        /// Load danh sach chuyen xe ung voi tuyen xe duoc chon
        /// </summary>
        /// <param name="tuyenxe"></param>
        private void LoadChuyenXe(TuyenXe tuyenxe)
        {
            var lst = ChuyenXeRepository.SelectByMaTuyenXe(tuyenxe.MaTuyenXe);

            DataTable dt = new DataTable();
            dt.Columns.Add("MaChuyenXe");
            dt.Columns.Add("HoTen");
            dt.Columns.Add("MaBSXe");
            dt.Columns.Add("GioKhoiHanh");
            dt.Columns.Add("DonGia");

            foreach (var item in lst)
            {
                dt.Rows.Add(item.MaChuyenXe, item.NhanVien.HoTen, item.MaBSXe, item.GioKhoiHanh, string.Format("{0:0,0}", item.DonGia));
            }

            DataView objTimeSheetDV = new System.Data.DataView(dt);
            objTimeSheetDV.AllowNew = false;
            dtgvChuyenXe.AutoGenerateColumns = false;
            dtgvChuyenXe.DataSource = objTimeSheetDV;
            dtgvChuyenXe.ClearSelection();  
        }

        private bool ValidateInput(ref string errorText)
        {
            if (dtTuNgay.Value == DateTime.MinValue)
            {
                errorText = "Vui lòng chọn ngày bắt đầu";
                return false;
            }
            if (dtDenNgay.Value == DateTime.MinValue)
            {
                errorText = "Vui lòng chọn ngày kết thúc";
                return false;
            }
            if (string.Empty.Equals(txtMaTuyenXe.Text))
            {
                errorText = "Vui lòng chọn tuyến xe";
                return false;
            }
            if (string.Empty.Equals(txtMaChuyenXe.Text))
            {
                errorText = "Vui lòng chọn chuyến xe";
                return false;
            }
            return true;
        }

        /// <summary>
        /// Cap nhat lich hoat dong
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCapNhat_Click(object sender, EventArgs e)
        {
            var errorText = string.Empty;
            if (!ValidateInput(ref errorText))
            {
                MessageBox.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            var lichHoatDong = LichHoatDongRepository.SelectByMaChuyenXeNgayBDNgayKT(int.Parse(txtMaChuyenXe.Text), dtTuNgay.Value, dtDenNgay.Value);
            var result = false;

            // Them oi lich hoat dong
            if (lichHoatDong == null)
                result = ActionAdd();
            else// Cap nhat lich hoat dong
                result = ActionUpdate(lichHoatDong);

            if (result)
            {
                MessageBoxEx.Show("Cập nhật dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBoxEx.Show("Cập nhật dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Them lich host dong
        /// </summary>
        /// <returns></returns>
        private bool ActionAdd()
        {
            try
            {
                DataContext.Instance.Connection.Open();
                using (var transaction = DataContext.Instance.Connection.BeginTransaction())
                {
                    var lichHoatDong = new LichHoatDong
                    {
                        MaChuyenXe = int.Parse(txtMaChuyenXe.Text),
                        NgayBatDau = dtTuNgay.Value,
                        NgayKetThuc = dtDenNgay.Value
                    };
                    if (LichHoatDongRepository.Insert(lichHoatDong))
                    {
                        // Insert chi tiet
                        var row = dtgvChuyenXe.Rows[dtgvChuyenXe.SelectedRows[0].Index];
                        var lstCTHD = new List<ChiTietLichHoatDong>();

                        // Hoat dong ngay thu 2
                        if (row.Cells["Thu2"].Value != null && bool.Parse(row.Cells["Thu2"].Value.ToString()))
                        {
                            lstCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value
                            });
                        }

                        // Hoat dong ngay thu 3
                        if (row.Cells["Thu3"].Value!=null && bool.Parse(row.Cells["Thu3"].Value.ToString()))
                        {
                            lstCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value.AddDays(1)
                            });
                        }

                        // Hoat dong ngay thu 4
                        if (row.Cells["Thu4"].Value != null && bool.Parse(row.Cells["Thu4"].Value.ToString()))
                        {
                            lstCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value.AddDays(2)
                            });
                        }

                        // Hoat dong ngay thu 5
                        if (row.Cells["Thu5"].Value != null && bool.Parse(row.Cells["Thu5"].Value.ToString()))
                        {
                            lstCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value.AddDays(3)
                            });
                        }

                        // Hoat dong ngay thu 6
                        if (row.Cells["Thu6"].Value != null && bool.Parse(row.Cells["Thu6"].Value.ToString()))
                        {
                            lstCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value.AddDays(4)
                            });
                        }

                        // Hoat dong ngay thu 7
                        if (row.Cells["Thu7"].Value != null && bool.Parse(row.Cells["Thu7"].Value.ToString()))
                        {
                            lstCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value.AddDays(5)
                            });
                        }

                        // Hoat dong ngay thu 3
                        if (row.Cells["CN"].Value != null && bool.Parse(row.Cells["CN"].Value.ToString()))
                        {
                            lstCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value.AddDays(6)
                            });
                        }

                        // Loop qua danh sach chi tiet hoat dong se duoc insert
                        foreach (ChiTietLichHoatDong chitiet in lstCTHD)
                        {
                            if (!ChiTietLichHoatDongRepository.Insert(chitiet))
                            {
                                DataContext.Instance.Connection.Close();
                                return false;
                            }
                        }

                        transaction.Commit();
                    }
                    else
                    {
                        DataContext.Instance.Connection.Close();
                        return false;
                    }
                }
                DataContext.Instance.Connection.Close();
                return true;
            }
            catch
            {
                DataContext.Instance.Connection.Close();
                return false;
            }
        }

        private string FromENDayOfWeekToVN(DayOfWeek dayOfWeek)
        {
            var result = string.Empty;
            switch (dayOfWeek)
            {
                case DayOfWeek.Monday:
                    result = "2";
                    break;
                case DayOfWeek.Tuesday:
                    result = "3";
                    break;
                case DayOfWeek.Wednesday:
                    result = "4";
                    break;
                case DayOfWeek.Thursday:
                    result = "5";
                    break;
                case DayOfWeek.Friday:
                    result = "6";
                    break;
                case DayOfWeek.Saturday:
                    result = "7";
                    break;
                case DayOfWeek.Sunday:
                    result = "Chủ nhật";
                    break;
            }
            return result;
        }

        /// <summary>
        /// Upload lich host dong
        /// </summary>
        /// <returns></returns>
        private bool ActionUpdate(LichHoatDong lichHoatDong)
        {
            try
            {
                DataContext.Instance.Connection.Open();
                using (var transaction = DataContext.Instance.Connection.BeginTransaction())
                {
                    // Insert chi tiet
                    var row = dtgvChuyenXe.Rows[dtgvChuyenXe.SelectedRows[0].Index];
                    var lstAddCTHD = new List<ChiTietLichHoatDong>();
                    var lstRemoveCTHD = new List<ChiTietLichHoatDong>();
                    ChiTietLichHoatDong chitiet = null;

                    // Hoat dong ngay thu 2
                    if (row.Cells["Thu2"].Value != null && bool.Parse(row.Cells["Thu2"].Value.ToString()))
                    {
                        if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Monday) == null)
                        {
                            lstAddCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value
                            });
                        }           
                    }
                    else
                    {
                        if ((chitiet = lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Monday)) != null)
                        {
                            lstRemoveCTHD.Add(chitiet);
                        }
                    }

                    // Hoat dong ngay thu 3
                    if (row.Cells["Thu3"].Value != null && bool.Parse(row.Cells["Thu3"].Value.ToString()))
                    {
                        if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Tuesday) == null)
                        {
                            lstAddCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value.AddDays(1)
                            });
                        }
                    }
                    else
                    {
                        if ((chitiet = lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Tuesday)) != null)
                        {
                            lstRemoveCTHD.Add(chitiet);
                        }
                    }

                    // Hoat dong ngay thu 4
                    if (row.Cells["Thu4"].Value != null && bool.Parse(row.Cells["Thu4"].Value.ToString()))
                    {
                        if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Wednesday) == null)
                        {
                            lstAddCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value.AddDays(2)
                            });
                        }
                    }
                    else
                    {
                        if ((chitiet = lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Wednesday)) != null)
                        {
                            lstRemoveCTHD.Add(chitiet);
                        }
                    }

                    // Hoat dong ngay thu 5
                    if (row.Cells["Thu5"].Value != null && bool.Parse(row.Cells["Thu5"].Value.ToString()))
                    {
                        if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Thursday) == null)
                        {
                            lstAddCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value.AddDays(3)
                            });
                        }
                    }
                    else
                    {
                        if ((chitiet = lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Thursday)) != null)
                        {
                            lstRemoveCTHD.Add(chitiet);
                        }
                    }

                    // Hoat dong ngay thu 6
                    if (row.Cells["Thu6"].Value != null && bool.Parse(row.Cells["Thu6"].Value.ToString()))
                    {
                        if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Friday) == null)
                        {
                            lstAddCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value.AddDays(4)
                            });
                        }
                    }
                    else
                    {
                        if ((chitiet = lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Friday)) != null)
                        {
                            lstRemoveCTHD.Add(chitiet);
                        }
                    }

                    // Hoat dong ngay thu 7
                    if (row.Cells["Thu7"].Value != null && bool.Parse(row.Cells["Thu7"].Value.ToString()))
                    {
                        if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Saturday) == null)
                        {
                            lstAddCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value.AddDays(5)
                            });
                        }
                    }
                    else
                    {
                        if ((chitiet = lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Saturday)) != null)
                        {
                            lstRemoveCTHD.Add(chitiet);
                        }
                    }

                    // Hoat dong ngay chu nhat
                    if (row.Cells["CN"].Value != null && bool.Parse(row.Cells["CN"].Value.ToString()))
                    {
                        if (lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Sunday) == null)
                        {
                            lstAddCTHD.Add(new ChiTietLichHoatDong
                            {
                                MaLichHoatDong = lichHoatDong.MaLichHoatDong,
                                NgayHoatDong = dtTuNgay.Value.AddDays(6)
                            });
                        }
                    }
                    else
                    {
                        if ((chitiet = lichHoatDong.ChiTietLichHoatDong.FirstOrDefault(n => n.NgayHoatDong.Value.DayOfWeek == DayOfWeek.Sunday)) != null)
                        {
                            lstRemoveCTHD.Add(chitiet);
                        }
                    }

                    // Remove chi tiet cu
                    var errMsg = string.Empty;
                    foreach (ChiTietLichHoatDong chitiet1 in lstRemoveCTHD)
                    {
                        if (!ChiTietLichHoatDongRepository.Delete(chitiet1.MaChiTietLichHoatDong))
                        {
                            errMsg += FromENDayOfWeekToVN(chitiet1.NgayHoatDong.Value.DayOfWeek);
                        }
                    }

                    if (!string.Empty.Equals(errMsg))
                    {
                        MessageBoxEx.Show(string.Format("Đã đặt vé cho các ngày {0}, nên không thể cập nhật lịch hoạt động cho các ngày này được", errMsg), "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    }

                    // Loop qua danh sach chi tiet hoat dong se duoc insert
                    foreach (ChiTietLichHoatDong chitiet1 in lstAddCTHD)
                    {
                        if (!ChiTietLichHoatDongRepository.Insert(chitiet1))
                        {
                            DataContext.Instance.Connection.Close();
                            return false;
                        }
                    }

                    transaction.Commit();
                }
                DataContext.Instance.Connection.Close();
                return true;
            }
            catch
            {
                DataContext.Instance.Connection.Close();
                return false;
            }
        }

        private void dtTuNgay_ValueChanged(object sender, EventArgs e)
        {
            if (dtTuNgay.Value == DateTime.MinValue)
                return;
            var selectedDate = dtTuNgay.Value;
            if (selectedDate.DayOfWeek != DayOfWeek.Monday)
            {
                MessageBoxEx.Show("Ngày bắt đầu phải là thứ 2", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                dtTuNgay.Value = DateTime.MinValue;
                return;
            }

            if (dtDenNgay.Value != DateTime.MinValue)
            {
                if (dtTuNgay.Value > dtDenNgay.Value)
                {
                    MessageBoxEx.Show("Ngày bắt đầu lớn hơn ngày kết thúc", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    dtTuNgay.Value = DateTime.MinValue;
                    return;
                }
                if (dtDenNgay.Value > dtTuNgay.Value.AddDays(6))
                {
                    MessageBoxEx.Show("Ngày bắt đầu và ngày kết thúc không cùng 1 tuần", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    dtTuNgay.Value = DateTime.MinValue;
                    return;
                }

                // Load danh sach tuyen xe
                LoadTuyenXes();
            }
        }

        private void dtDenNgay_ValueChanged(object sender, EventArgs e)
        {
            if (dtDenNgay.Value == DateTime.MinValue)
                return;
            var selectedDate = dtDenNgay.Value;
            if (selectedDate.DayOfWeek != DayOfWeek.Sunday)
            {
                MessageBoxEx.Show("Ngày kết thúc phải là chủ nhật", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                dtDenNgay.Value = DateTime.MinValue;
                return;
            }

            if (dtTuNgay.Value != DateTime.MinValue)
            {
                if (dtTuNgay.Value > dtDenNgay.Value)
                {
                    MessageBoxEx.Show("Ngày bắt đầu lớn hơn ngày kết thúc", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    dtDenNgay.Value = DateTime.MinValue;
                    return;
                }
                if (dtDenNgay.Value > dtTuNgay.Value.AddDays(6))
                {
                    MessageBoxEx.Show("Ngày bắt đầu và ngày kết thúc không cùng 1 tuần", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    dtDenNgay.Value = DateTime.MinValue;
                    return;
                }

                // Load danh sach tuyen xe
                LoadTuyenXes();
            }
        }

        private void dtgvChuyenXe_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dtgvChuyenXe.SelectedRows == null || dtgvChuyenXe.SelectedRows.Count == 0)
                return;

            txtMaChuyenXe.Text = dtgvChuyenXe.SelectedRows[0].Cells["MaChuyenXe"].Value.ToString();
        }

        private void btnNhapMoi_Click(object sender, EventArgs e)
        {
            dtTuNgay.Value = DateTime.MinValue;
            dtDenNgay.Value = DateTime.MinValue;
            txtMaTuyenXe.Text = string.Empty;
            txtMaChuyenXe.Text = string.Empty;
            dtgvData.DataSource = null;
            dtgvChuyenXe.DataSource = null;
        }
	}

}
